# -*- coding: utf-8 -*-
# @Time    : 2024/6/27 11:16
# @Author  : yujiahao
# @File    : 18_pandas_csv.py
# @description:Pandas csv读写文件

"""
文件的读写操作属于计算机的 IO 操作，Pandas IO 操作提供了一些读取器函数，比如 pd.read_csv()、pd.read_json 等，它们都返回一个 Pandas 对象。

在 Pandas 中用于读取文本的函数有两个，分别是： read_csv() 和 read_table() ，它们能够自动地将表格数据转换为 DataFrame 对象。


【read_csv 的语法格式】

pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer',names=None, index_col=None, usecols=None)

参数说明：
    - filepath_or_buffer: str, path object or file-like object
        文件路径或类文件对象。可以是本地文件路径、URL 等。

    - sep: str, default ','
        分隔符，默认为逗号。用于分隔文件中的字段。

    - delimiter: str, default None
        替代分隔符，功能类似于 `sep`。如果设置了 `sep`，这个参数将被忽略。

    - header: int, list of int, default 'infer'
        行号用作列名，默认为 'infer'，即自动推断。如果文件没有列名，可以设置为 `None`。

    - names: array-like, optional
        用于结果的列名列表。如果文件中没有列名，可以使用这个参数指定列名。

    - index_col: int, str, sequence of int / str, or False, default None
        用作行索引的列。可以是列的名称或列的整数索引。

    - usecols: list-like or callable, optional
        读取的列。可以是列名的列表或列索引的列表。如果是 callable，则会对每个列名调用该函数，并保留返回 True 的列。


"""
import numpy as np
import pandas as pd


# todo 1、read_csv()
def pandas_read_csv(filepath):
    print('原始数据：\n', pd.read_csv(filepath))

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # todo 1) 自定义索引
    '''在 CSV 文件中指定了一个列，然后使用index_col可以实现自定义索引。将指定的列作为索引'''

    print('自定义索引：\n', pd.read_csv(filepath, index_col=['Name']))

    # todo 2) 查看每一列的dtype

    '''注意：默认情况下，Salary 列的 dtype 是 int 类型，但结果显示其为 float 类型，因为我们已经在代码中做了类型转换。'''

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    print('查看每一列的dtype：\n', pd.read_csv(filepath, dtype={'Salary': np.float64}).dtypes)

    # todo 3) 更改文件标头名 这里如果不指定header的行数则默认在原有的第一行列名前面加一行

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    print('更改文件标头名：\n', pd.read_csv(filepath, names=['a', 'b', 'c', 'd', 'e'], header=0))

    # todo 4) 跳过指定的行数

    '''skiprows参数表示跳过指定的行数。注意：包含标头所在行。'''

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    print('更改文件标头名：\n', pd.read_csv(filepath, names=['a', 'b', 'c', 'd', 'e'], skiprows=2))


# todo 2、 to_csv()

def pandas_write_scv(file_output_path_csv):
    data = {'Name': ['Smith', 'Parker'], 'ID': [101, 102], 'Language': ['Python', 'JavaScript']}
    info = pd.DataFrame(data)
    print('DataFrame:\n', info)
    # 转换为csv数据
    '''当使用 index=True 保存 DataFrame 时，Pandas 会将索引作为第一列保存，但索引列没有列名，因此会在第一行的第一个位置产生一个逗号。
    也可以使用sep指定分隔符'''
    csv_data = info.to_csv(file_output_path_csv, index=False, sep='|')
    print(csv_data)


def main():
    file_input_path_csv = '../../../input/nba.csv'

    file_output_path_csv = '../../../output/newnba.csv'

    # pandas_read_csv(file_input_path_csv)

    pandas_write_scv(file_output_path_csv)


if __name__ == '__main__':
    main()
